#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
短信验证码功能测试脚本
演示验证码发送、验证、登录等功能
"""

import requests
import json
import time

BASE_URL = 'http://127.0.0.1:8080'


def print_section(title):
    """打印区块标题"""
    print("\n" + "=" * 60)
    print(f" {title} ".center(60, "="))
    print("=" * 60)


def print_test(test_name):
    """打印测试名称"""
    print(f"\n【测试】{test_name}")
    print("-" * 60)


def print_result(response):
    """打印响应结果"""
    print(f"状态码: {response.status_code}")
    print(f"响应: {json.dumps(response.json(), ensure_ascii=False, indent=2)}")


def test_send_register_code():
    """测试发送注册验证码"""
    print_test("发送注册验证码")
    
    url = f'{BASE_URL}/auth/send-code'
    data = {
        'phone': '13900000001',
        'code_type': 'register'
    }
    
    try:
        response = requests.post(url, json=data)
        print_result(response)
        
        result = response.json()
        if result.get('code') == 200:
            code = result.get('data', {}).get('code')
            print(f"\n✓ 验证码发送成功！验证码是: {code}")
            return code
        else:
            print(f"\n✗ 发送失败: {result.get('error')}")
            return None
    except Exception as e:
        print(f"\n✗ 请求失败: {e}")
        return None


def test_send_login_code():
    """测试发送登录验证码"""
    print_test("发送登录验证码")
    
    url = f'{BASE_URL}/auth/send-code'
    data = {
        'phone': '13800138000',  # 使用已存在的管理员账号
        'code_type': 'login'
    }
    
    try:
        response = requests.post(url, json=data)
        print_result(response)
        
        result = response.json()
        if result.get('code') == 200:
            code = result.get('data', {}).get('code')
            print(f"\n✓ 验证码发送成功！验证码是: {code}")
            return code
        else:
            print(f"\n✗ 发送失败: {result.get('error')}")
            return None
    except Exception as e:
        print(f"\n✗ 请求失败: {e}")
        return None


def test_verify_code(phone, code, code_type='register'):
    """测试验证验证码"""
    print_test(f"验证验证码 ({code_type})")
    
    url = f'{BASE_URL}/auth/verify-code'
    data = {
        'phone': phone,
        'code': code,
        'code_type': code_type
    }
    
    try:
        response = requests.post(url, json=data)
        print_result(response)
        
        result = response.json()
        if result.get('code') == 200:
            print(f"\n✓ 验证码验证成功！")
            return True
        else:
            print(f"\n✗ 验证失败: {result.get('error')}")
            return False
    except Exception as e:
        print(f"\n✗ 请求失败: {e}")
        return False


def test_login_with_code(phone, code):
    """测试验证码登录"""
    print_test("验证码登录")
    
    url = f'{BASE_URL}/auth/login-with-code'
    data = {
        'phone': phone,
        'code': code
    }
    
    try:
        response = requests.post(url, json=data)
        print_result(response)
        
        result = response.json()
        if result.get('code') == 200:
            user_data = result.get('data', {})
            print(f"\n✓ 登录成功！")
            print(f"  用户: {user_data.get('username')}")
            print(f"  手机: {user_data.get('phone')}")
            print(f"  余额: {user_data.get('money')}")
            return True
        else:
            print(f"\n✗ 登录失败: {result.get('error')}")
            return False
    except Exception as e:
        print(f"\n✗ 请求失败: {e}")
        return False


def test_send_frequency_limit():
    """测试发送频率限制"""
    print_test("测试发送频率限制")
    
    phone = '13900000002'
    url = f'{BASE_URL}/auth/send-code'
    
    # 第一次发送
    print("第一次发送...")
    data = {'phone': phone, 'code_type': 'register'}
    response1 = requests.post(url, json=data)
    result1 = response1.json()
    
    if result1.get('code') == 200:
        print("✓ 第一次发送成功")
    else:
        # 可能手机号已注册，换一个
        phone = f'139{int(time.time()) % 100000000:08d}'
        data['phone'] = phone
        response1 = requests.post(url, json=data)
        result1 = response1.json()
    
    # 立即第二次发送（应该失败）
    print("\n立即再次发送...")
    response2 = requests.post(url, json=data)
    result2 = response2.json()
    
    if result2.get('code') != 200:
        print(f"✓ 频率限制生效: {result2.get('error')}")
    else:
        print("✗ 频率限制未生效")


def test_code_expire():
    """测试验证码过期（需要修改过期时间才能快速测试）"""
    print_test("验证码过期测试")
    print("注：验证码有效期为5分钟，实际测试需要等待")
    print("可以在 sms_service.py 中临时修改 CODE_EXPIRE_TIME 为较小值进行测试")


def test_wrong_code():
    """测试错误验证码"""
    print_test("测试错误验证码")
    
    url = f'{BASE_URL}/auth/verify-code'
    data = {
        'phone': '13800138000',
        'code': '000000',  # 错误的验证码
        'code_type': 'login'
    }
    
    try:
        response = requests.post(url, json=data)
        print_result(response)
        
        result = response.json()
        if result.get('code') != 200:
            print(f"\n✓ 正确识别了错误验证码: {result.get('error')}")
        else:
            print("\n✗ 未能识别错误验证码")
    except Exception as e:
        print(f"\n✗ 请求失败: {e}")


def main():
    """主测试流程"""
    print_section("短信验证码功能测试")
    
    print("\n本测试将演示以下功能:")
    print("1. 发送注册验证码")
    print("2. 发送登录验证码")
    print("3. 验证验证码")
    print("4. 验证码登录")
    print("5. 发送频率限制")
    print("6. 错误验证码处理")
    
    input("\n按回车键开始测试...")
    
    # 测试1: 发送注册验证码
    print_section("场景1: 新用户注册")
    register_code = test_send_register_code()
    
    if register_code:
        print("\n提示: 接下来可以使用这个验证码进行注册")
        print(f"注册接口: POST {BASE_URL}/user/user")
        print("需要携带参数: id, username, phone, password, sms_code")
    
    input("\n按回车键继续...")
    
    # 测试2: 发送登录验证码
    print_section("场景2: 已有用户验证码登录")
    login_code = test_send_login_code()
    
    if login_code:
        time.sleep(1)
        # 测试3: 使用验证码登录
        test_login_with_code('13800138000', login_code)
    
    input("\n按回车键继续...")
    
    # 测试4: 验证码验证
    print_section("场景3: 单独验证验证码")
    if login_code:
        # 注意：如果上面已经用过一次，这里会失败（因为验证码已被消耗）
        print("注意: 验证码使用后会自动失效")
        test_verify_code('13800138000', login_code, 'login')
    
    input("\n按回车键继续...")
    
    # 测试5: 错误验证码
    print_section("场景4: 错误验证码处理")
    test_wrong_code()
    
    input("\n按回车键继续...")
    
    # 测试6: 频率限制
    print_section("场景5: 发送频率限制")
    test_send_frequency_limit()
    
    # 总结
    print_section("测试完成")
    print("\n验证码功能说明:")
    print("✓ 验证码为6位数字")
    print("✓ 有效期5分钟")
    print("✓ 60秒内不能重复发送")
    print("✓ 验证成功后自动失效")
    print("✓ 开发环境会返回验证码（生产环境应删除）")
    print("\n查看服务器日志可以看到详细的验证码信息")
    print("日志文件: logs/debug.log")


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n测试被用户中断")
    except Exception as e:
        print(f"\n\n测试过程中发生错误: {e}")
        import traceback
        traceback.print_exc()


